home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Toolbox / Visual Basic Toolbox (P.I.E.)(1996).ISO / clocks / ttcode / thetime.frm < prev    next >
Text File  |  1995-07-25  |  49KB  |  1,241 lines

  1. VERSION 2.00
  2. Begin Form thetime 
  3.    BackColor       =   &H00FFFFFF&
  4.    Caption         =   "theTime"
  5.    ClientHeight    =   1335
  6.    ClientLeft      =   1845
  7.    ClientTop       =   1995
  8.    ClientWidth     =   4320
  9.    ClipControls    =   0   'False
  10.    Height          =   1740
  11.    Icon            =   THETIME.FRX:0000
  12.    KeyPreview      =   -1  'True
  13.    Left            =   1785
  14.    LinkTopic       =   "Form2"
  15.    ScaleHeight     =   89
  16.    ScaleMode       =   3  'Pixel
  17.    ScaleWidth      =   288
  18.    Top             =   1650
  19.    Visible         =   0   'False
  20.    Width           =   4440
  21.    Begin MsgBlaster MsgBlaster1 
  22.       Prop8           =   "Click on ""..."" for the About Box ---->"
  23.    End
  24.    Begin CommonDialog CMDialog1 
  25.       Left            =   0
  26.       Top             =   360
  27.    End
  28.    Begin Timer Timer1 
  29.       Enabled         =   0   'False
  30.       Interval        =   1000
  31.       Left            =   0
  32.       Top             =   0
  33.    End
  34.    Begin PZLabel TimePan 
  35.       Height          =   1065
  36.       Left            =   870
  37.       PictureStyle    =   3  'Tiled
  38.       TabIndex        =   0
  39.       Top             =   90
  40.       Visible         =   0   'False
  41.       Width           =   2535
  42.    End
  43. End
  44. Option Explicit
  45.  
  46. '*******************************************************
  47. '*                                                     *
  48. '*   theTime, a mildly interesting Windows 3.x clock   *
  49. '*   Written by Visual Bits                            *
  50. '*   Copyright ⌐ 1995                                  *
  51. '*                                                     *
  52. '*   This software and any documentation are supplied  *
  53. '*   "AS IS".  The author makes no warranty of any     *
  54. '*   kind, either express or implied, with respect to  *
  55. '*   this software and accompanying documentation.  In *
  56. '*   no event shall the author of this software be     *
  57. '*   liable for any damages arising out of the use of  *
  58. '*   this product. Your use of this software indicates *
  59. '*   that you have read and agreed to these terms.     *
  60. '*                                                     *
  61. '*   Other then that, you may use this program's       *
  62. '*   source code in any way you find useful.           *
  63. '*                                                     *
  64. '*                                                     *
  65. '*******************************************************
  66.  
  67. ' first identify yourself
  68. Const AppName = "theTime"
  69. Const Version = "2.5"
  70. Const Company = "Visual Bits"
  71. Const CopyRight = "Copyright ⌐ 1995"
  72.  
  73. ' variables used throughout this form
  74. Dim MyRect As RECT
  75. Dim BorderSize As Integer, TitleSize As Integer
  76. Dim dtw As Integer, dth As Integer ' short for desktop width & height
  77. Dim TopMost As Integer
  78. Dim Border As Integer, OldBorder As Integer
  79. Dim Stuck As Integer
  80. Dim Zoomed As Integer
  81. Dim hMyMenu As Integer
  82.  
  83. ' Background modes
  84. Const BM_SOLID = 0
  85. Const BM_BITMAP = 1
  86. Const BM_TRANSPARENT = 2
  87.  
  88. Dim BackMode As Integer
  89. Dim BackBmp As String
  90. Dim ErasingBackgrnd As Integer
  91.  
  92. Dim InitFile As String
  93. Dim nl As String
  94.  
  95. ' bit mask for date and time menu options
  96. Dim DateOption As Integer
  97. Const DO_DF = &H7
  98. Const DO_MT = &H10
  99. Const DO_DN = &H20
  100. Const DO_FM = &H40
  101. Const DO_FY = &H80
  102. Const DO_1L = &H100
  103.  
  104. ' bit mask for Font options
  105. Const FO_3D = &H7
  106. Const FO_BD = &H10
  107. Const FO_IT = &H20
  108. Const FO_ST = &H40
  109. Const FO_UL = &H80
  110.  
  111. ' save the last time and date displayed
  112. Dim sTime As String, sDate As String
  113.  
  114. ' the so called font factor, used to guess how large fonts should be
  115. Dim FontFact As Single
  116.  
  117. Sub AdjustForm (f As Form)
  118. '*******************************************************
  119. '*                                                     *
  120. '*   Adjust the position of a form to be either just   *
  121. '*   above the main form or just below it, but never   *
  122. '*   off the screen.                                   *
  123. '*                                                     *
  124. '*******************************************************
  125.     
  126.     Dim fLeft As Integer, ftop As Integer, gap As Integer
  127.     Dim i As Integer
  128.     
  129.     gap = BorderSize * Tpx
  130.     
  131.     ' put the horizontal position in the middle of the time
  132.     fLeft = Left - (f.Width - Width) \ 2
  133.  
  134.     ' but not off the screen
  135.     i = Screen.Width - f.Width - gap
  136.     If fLeft > i Then fLeft = i
  137.     If fLeft < gap Then fLeft = gap
  138.  
  139.     ' put the vertical postion above or below the time
  140.     If Top + Height \ 2 > Screen.Height \ 2 Then
  141.         ftop = Top - f.Height - gap
  142.     Else
  143.         ftop = Top + Height + gap
  144.     End If
  145.  
  146.     ' or in the middle of the time if off the screen
  147.     i = Screen.Height - f.Height - gap
  148.     If ftop < gap Or ftop > i Then
  149.         ftop = Top + (Height - f.Height) \ 2
  150.     End If
  151.     f.Move fLeft, ftop
  152. End Sub
  153.  
  154. Sub CheckBackItem ()
  155. '*******************************************************
  156. '*                                                     *
  157. '*   Check the background mode menu items and set      *
  158. '*   BackMode accordingly.                             *
  159. '*                                                     *
  160. '*******************************************************
  161.     
  162.     Dim hSubMenu As Integer
  163.  
  164.     hSubMenu = GetSubMenu(hMyMenu, 4)
  165.     CheckMenuItem hSubMenu, BackMode, MF_BYPOSITION Or MF_CHECKED
  166.     CheckMenuItem hSubMenu, (BackMode Xor 3) And BM_BITMAP, MF_BYPOSITION Or MF_UNCHECKED
  167.     CheckMenuItem hSubMenu, (BackMode Xor 3) And BM_TRANSPARENT, MF_BYPOSITION Or MF_UNCHECKED
  168. End Sub
  169.  
  170. Function CreateMyMenu () As Integer
  171. '*******************************************************
  172. '*                                                     *
  173. '*   This creates the menu that is inserted into the   *
  174. '*   system menu and pops up whenever the right button *
  175. '*   is clicked.  Note that using a VB created menu    *
  176. '*   is not possible since a VB menu must be visible   *
  177. '*   on the form menu line to be popped up.            *
  178. '*                                                     *
  179. '*******************************************************
  180.     
  181.     Dim hMenu As Integer, hSub1Menu As Integer, hSub2Menu As Integer
  182.     Dim checked As Integer
  183.     
  184.     hMenu = CreateMenu()
  185.     checked = 0: If TopMost = HWND_TOPMOST Then checked = MF_CHECKED
  186.     AppendMenu hMenu, MF_STRING Or checked, 100, ("&Keep On Top")
  187.     checked = 0: If Border Then checked = MF_CHECKED
  188.     AppendMenu hMenu, MF_STRING Or checked, 200, ("&Title Bar")
  189.     checked = 0: If Stuck Then checked = MF_CHECKED
  190.     AppendMenu hMenu, MF_STRING Or checked, 700, ("&Stuck")
  191.     
  192.     AppendMenu hMenu, MF_SEPARATOR, 0, 0&
  193.     hSub1Menu = CreateMenu()
  194.     checked = 0: If BackMode = BM_SOLID Then checked = MF_CHECKED
  195.     AppendMenu hSub1Menu, MF_STRING Or checked, 310, ("&Solid Background")
  196.     checked = 0: If BackMode = BM_BITMAP Then checked = MF_CHECKED
  197.     AppendMenu hSub1Menu, MF_STRING Or checked, 320, ("&Load Bitmap...")
  198.     checked = 0: If BackMode = BM_TRANSPARENT Then checked = MF_CHECKED
  199.     AppendMenu hSub1Menu, MF_STRING Or checked, 330, ("&Transparent")
  200.     
  201.     AppendMenu hSub1Menu, MF_SEPARATOR, 0, 0&
  202.     AppendMenu hSub1Menu, MF_STRING, 340, ("&Background Color...")
  203.     AppendMenu hMenu, MF_POPUP, hSub1Menu, ("&Background")
  204.     
  205.     hSub1Menu = CreateMenu()
  206.     AppendMenu hSub1Menu, MF_STRING, 420, ("&Font...")
  207.     hSub2Menu = CreateMenu()
  208.     checked = 0: If TimePan.Font3D = 0 Then checked = MF_CHECKED
  209.     AppendMenu hSub2Menu, MF_STRING Or checked, 410, ("&1 None")
  210.     checked = 0: If TimePan.Font3D = 1 Then checked = MF_CHECKED
  211.     AppendMenu hSub2Menu, MF_STRING Or checked, 411, ("&2 Block Left")
  212.     checked = 0: If TimePan.Font3D = 2 Then checked = MF_CHECKED
  213.     AppendMenu hSub2Menu, MF_STRING Or checked, 412, ("&3 Block Right")
  214.     checked = 0: If TimePan.Font3D = 3 Then checked = MF_CHECKED
  215.     AppendMenu hSub2Menu, MF_STRING Or checked, 413, ("&4 Drop Left")
  216.     checked = 0: If TimePan.Font3D = 4 Then checked = MF_CHECKED
  217.     AppendMenu hSub2Menu, MF_STRING Or checked, 414, ("&5 Drop Right")
  218.     AppendMenu hSub1Menu, MF_POPUP, hSub2Menu, ("Font &3D Options")
  219.     
  220.     hSub2Menu = CreateMenu()
  221.     AppendMenu hSub2Menu, MF_STRING, 418, ("&Increase")
  222.     AppendMenu hSub2Menu, MF_STRING, 416, ("&Decrease")
  223.     AppendMenu hSub2Menu, MF_STRING, 419, ("I&ncrease More")
  224.     AppendMenu hSub2Menu, MF_STRING, 415, ("D&ecrease More")
  225.     AppendMenu hSub1Menu, MF_POPUP, hSub2Menu, ("Font 3D &Sizes")
  226.     
  227.     AppendMenu hSub1Menu, MF_STRING, 425, ("Font 3D &Color...")
  228.     
  229.     AppendMenu hSub1Menu, MF_SEPARATOR, 0, 0&
  230.     checked = 0: If DateOption And DO_MT Then checked = MF_CHECKED
  231.     AppendMenu hSub1Menu, MF_STRING Or checked, 430, ("Military &Time")
  232.     checked = 0: If DateOption And DO_DN Then checked = MF_CHECKED
  233.     AppendMenu hSub1Menu, MF_STRING Or checked, 440, ("Full &Day")
  234.     checked = 0: If DateOption And DO_FM Then checked = MF_CHECKED
  235.     AppendMenu hSub1Menu, MF_STRING Or checked, 450, ("Full &Month")
  236.     checked = 0: If DateOption And DO_FY Then checked = MF_CHECKED
  237.     AppendMenu hSub1Menu, MF_STRING Or checked, 460, ("Full &Year")
  238.     checked = 0: If DateOption And DO_1L Then checked = MF_CHECKED
  239.     AppendMenu hSub1Menu, MF_STRING Or checked, 465, ("One &Line")
  240.     AppendMenu hSub1Menu, MF_SEPARATOR, 0, 0&
  241.     hSub2Menu = CreateMenu()
  242.     checked = 0: If (DateOption And DO_DF) = 0 Then checked = MF_CHECKED
  243.     AppendMenu hSub2Menu, MF_STRING Or checked, 470, ("&1 No Date")
  244.     checked = 0: If (DateOption And DO_DF) = 1 Then checked = MF_CHECKED
  245.     AppendMenu hSub2Menu, MF_STRING Or checked, 471, ("&2 m/d/y")
  246.     checked = 0: If (DateOption And DO_DF) = 2 Then checked = MF_CHECKED
  247.     AppendMenu hSub2Menu, MF_STRING Or checked, 472, ("&3 dd-mmm-y")
  248.     checked = 0: If (DateOption And DO_DF) = 3 Then checked = MF_CHECKED
  249.     AppendMenu hSub2Menu, MF_STRING Or checked, 473, ("&4 mmm dd, y")
  250.     checked = 0: If (DateOption And DO_DF) = 4 Then checked = MF_CHECKED
  251.     AppendMenu hSub2Menu, MF_STRING Or checked, 474, ("&4 mmm dd")
  252.     AppendMenu hSub1Menu, MF_POPUP, hSub2Menu, ("Date &Options")
  253.     AppendMenu hMenu, MF_POPUP, hSub1Menu, ("&Font && Time/Date Format")
  254.     AppendMenu hMenu, MF_STRING, 500, ("Bevel && Border &Options...")
  255.     AppendMenu hMenu, MF_SEPARATOR, 0, 0&
  256.     AppendMenu hMenu, MF_STRING, 600, ("&About...")
  257.     AppendMenu hMenu, MF_SEPARATOR, 0, 0&
  258.     AppendMenu hMenu, MF_STRING, 900, ("E&xit")
  259.  
  260.     CreateMyMenu = hMenu
  261.     
  262. End Function
  263.  
  264. Sub EraseBackGrnd ()
  265. '*******************************************************
  266. '*                                                     *
  267. '*   When theTime's form is transparent this routine   *
  268. '*   deals with erasing the background and making it   *
  269. '*   visible again.  Since the normal EraseBackgrnd    *
  270. '*   message is captured the VB form never paints.     *
  271. '*   Therefore by painting only the foreground of the  *
  272. '*   Pizazz control the illusion of transparancy is    *
  273. '*   created.  The big trick is whenever the form is   *
  274. '*   moved or resized or painted you need to make the  *
  275. '*   form briefly invisible so the real background is  *
  276. '*   updated, then make the form visible and paint     *
  277. '*   the foreground.  This routine does just that.     *
  278. '*                                                     *
  279. '*   ErasingBackgrnd is a state variable.              *
  280. '*   0 : hide the window                               *
  281. '*   -1: busy, go away                                 *
  282. '*   1: window is hidden, so show it                   *
  283. '*                                                     *
  284. '*******************************************************
  285.     
  286.     Dim i As Integer
  287.     
  288.     
  289.     If IsIconic(hWnd) = 0 And BackMode = BM_TRANSPARENT Then
  290.         If ErasingBackgrnd = 0 Then
  291.             ErasingBackgrnd = -1 ' working...
  292.             ShowWindow hWnd, SW_HIDE
  293.             DoEvents
  294.             ErasingBackgrnd = 1
  295.         ElseIf ErasingBackgrnd = 1 Then
  296.             ErasingBackgrnd = -1 ' working...
  297.             i = SW_SHOWNA
  298.             If Stuck Then i = SW_SHOWNOACTIVATE
  299.             ShowWindow hWnd, i
  300.             DoEvents
  301.             ErasingBackgrnd = 0 ' all done
  302.         End If
  303.     End If
  304. End Sub
  305.  
  306. Sub Form_KeyDown (keycode As Integer, Shift As Integer)
  307. '*******************************************************
  308. '*                                                     *
  309. '*   Handle the keyboard from here.  Allow the form    *
  310. '*   to be moved around the screen using the arrow     *
  311. '*   and shift keys.                                   *
  312. '*                                                     *
  313. '*******************************************************
  314.     
  315.     Dim x As Integer, y As Integer, MyW As Integer, MyH As Integer
  316.     
  317.     If IsZoomed(hWnd) Or Stuck Then Exit Sub
  318.     GetWindowRect hWnd, MyRect
  319.     x = MyRect.Left
  320.     y = MyRect.Top
  321.     MyW = MyRect.Right - MyRect.Left
  322.     MyH = MyRect.Bottom - MyRect.Top
  323.     Select Case keycode
  324.     Case KEY_LEFT
  325.         If Shift = 1 Then
  326.             x = 0
  327.         Else
  328.             x = x - 10
  329.         End If
  330.     Case KEY_UP
  331.         If Shift = 1 Then
  332.             y = 0
  333.         Else
  334.             y = y - 10
  335.         End If
  336.     Case KEY_RIGHT
  337.         If Shift = 1 Then
  338.             x = dtw - MyW
  339.         Else
  340.             x = x + 10
  341.         End If
  342.     Case KEY_DOWN
  343.         If Shift = 1 Then
  344.             y = dth - MyH
  345.         Else
  346.             y = y + 10
  347.         End If
  348.     End Select
  349.     SetWindowPos hWnd, 0, x, y, 0, 0, SWP_NOSIZE
  350. End Sub
  351.  
  352. Sub Form_Load ()
  353. '*******************************************************
  354. '*                                                     *
  355. '*   This is the starting point.  Setup the global     *
  356. '*   variables and the message blaster control, read   *
  357. '*   the ini file, show the form, and start the timer. *
  358. '*                                                     *
  359. '*******************************************************
  360.     
  361.     Dim hSysMenu As Integer
  362.     Dim aRect As RECT
  363.     Dim s As String
  364.     
  365.     ' Initialize global variables
  366.     Set CD = CmDialog1
  367.     TopMost = HWND_NOTOPMOST
  368.     Border = True
  369.     DateOption = 1
  370.     nl = Chr$(13) & Chr$(10)
  371.     FontFact = 1#
  372.     InitFile = app.Path & "\theTime.ini"
  373.     ErasingBackgrnd = True
  374.     
  375.     ' Get the DeskTop (Screen) and non-client dimensions
  376.     GetClientRect GetDeskTopWindow(), aRect
  377.     dtw = aRect.Right
  378.     dth = aRect.Bottom
  379.     Tpx = Screen.TwipsPerPixelX: Tpy = Screen.TwipsPerPixelY
  380.     BorderSize = (Width \ Tpx - ScaleWidth)
  381.     TitleSize = (Height \ Tpy - ScaleHeight) - BorderSize
  382.     BorderSize = BorderSize \ 2
  383.  
  384.     ' Setup the Message handling
  385.     MsgBlaster1.hWndTarget = hWnd
  386.     MsgBlaster1.MsgList(0) = WM_NCHITTEST
  387.     MsgBlaster1.MsgPassage(0) = -1 ' preprocess
  388.     MsgBlaster1.MsgList(1) = WM_RBUTTONDOWN
  389.     MsgBlaster1.MsgPassage(1) = 0 ' eat it
  390.     MsgBlaster1.MsgList(2) = WM_LBUTTONDBLCLK
  391.     MsgBlaster1.MsgPassage(2) = 0 ' eat it
  392.     MsgBlaster1.MsgList(3) = WM_NCRBUTTONDOWN
  393.     MsgBlaster1.MsgPassage(3) = 0 ' eat it
  394.     MsgBlaster1.MsgList(4) = WM_NCLBUTTONDBLCLK
  395.     MsgBlaster1.MsgPassage(4) = 0 ' eat it
  396.     MsgBlaster1.MsgList(5) = WM_COMMAND
  397.     MsgBlaster1.MsgPassage(5) = 1 ' post process
  398.     MsgBlaster1.MsgList(6) = WM_SYSCOMMAND
  399.     MsgBlaster1.MsgPassage(6) = 1 ' post process
  400.     MsgBlaster1.MsgList(7) = WM_DROPFILES
  401.     MsgBlaster1.MsgPassage(7) = 1 ' post process
  402.     MsgBlaster1.MsgList(8) = WM_MOUSEACTIVATE
  403.     MsgBlaster1.MsgPassage(8) = 0' eat it
  404.     MsgBlaster1.MsgList(9) = WM_ERASEBKGND
  405.     MsgBlaster1.MsgPassage(9) = 0 'eat it
  406.     MsgBlaster1.MsgList(10) = WM_MOVE
  407.     MsgBlaster1.MsgPassage(10) = 1 'post process
  408.     
  409.     LoadInitFile
  410.  
  411.     DragAcceptFiles hWnd, True
  412.  
  413.     ' create our menu and add it to the system menu
  414.     hMyMenu = CreateMyMenu()
  415.     hSysMenu = GetSystemMenu(hWnd, 0)
  416.     AppendMenu hSysMenu, MF_SEPARATOR, 0, 0&
  417.     s = AppName & " Options"
  418.     AppendMenu hSysMenu, MF_POPUP, hMyMenu, (s)
  419.  
  420.     SetBackMode
  421.     ShowForm
  422.  
  423.     Timer1_Timer
  424.     DoEvents
  425.  
  426.     ErasingBackgrnd = False
  427.     OldBorder = Border
  428.     Timer1.Enabled = True
  429. End Sub
  430.  
  431. Sub Form_Resize ()
  432. '*******************************************************
  433. '*                                                     *
  434. '*   When a form resizes and it's an icon put the time *
  435. '*   in the caption.  When borders come or go we       *
  436. '*   generally don't need to handle the resulting      *
  437. '*   resize, unless the form has been maxed (zoomed).  *
  438. '*   Otherwise, reset the caption, resize the font,    *
  439. '*   and size the panel.  Oh, call EraseBackGrnd in    *
  440. '*   case the form is transparent.                     *
  441. '*                                                     *
  442. '*******************************************************
  443.     
  444.     If IsIconic(hWnd) Then
  445.         Caption = sTime
  446.     ElseIf (OldBorder = Border) Or IsZoomed(hWnd) Then
  447.         If ErasingBackgrnd = 0 Then EraseBackGrnd
  448.         Caption = AppName
  449.         ResizeFont
  450.         TimePan.Move 0, 0, ScaleWidth, ScaleHeight
  451.     End If
  452. End Sub
  453.  
  454. Sub LoadBitMap ()
  455. '*******************************************************
  456. '*                                                     *
  457. '*   Put up a common dialog box to load a bitmap file. *
  458. '*                                                     *
  459. '*******************************************************
  460.     
  461.     CD.DialogTitle = "Background Bitmap"
  462.     CD.Filter = "BMP files|*.bmp|RLE Files|*.rle|All Files|*.*"
  463.     CD.FilterIndex = 1
  464.     CD.Filename = BackBmp
  465.     CD.Flags = OFN_FILEMUSTEXIST
  466.     CD.Action = DLG_FILE_OPEN
  467.     Screen.MousePointer = 11
  468.     Timer1.Enabled = False
  469.     BackBmp = CD.Filename
  470.     BackMode = BM_BITMAP
  471.     SetBackMode
  472.     Timer1.Enabled = True
  473.     Screen.MousePointer = 0
  474. End Sub
  475.  
  476. Sub LoadInitFile ()
  477. '*******************************************************
  478. '*                                                     *
  479. '*   Read in the .ini file and set most of the global  *
  480. '*   variables to reflect what you find.               *
  481. '*                                                     *
  482. '*******************************************************
  483.     
  484.     Dim i As Integer, j As Integer
  485.     Dim f As String, p As String
  486.     Dim R As String * 80
  487.  
  488.     'On Error Resume Next
  489.     
  490.     f = InitFile
  491.     p = "Preferences"
  492.     
  493.     i = GetPrivateProfileString(p, "Position", "", R, 80, f)
  494.     If i >= 7 Then
  495.         j = 1: i = InStr(j, R, " "): If i Then MyRect.Left = Val(Mid$(R, j, i - j))
  496.         j = i + 1: i = InStr(j, R, " "): If i Then MyRect.Right = Val(Mid$(R, j, i - j))
  497.         j = i + 1: i = InStr(j, R, " "): If i Then MyRect.Top = Val(Mid$(R, j, i - j))
  498.         j = i + 1: i = Len(R): If i > j Then MyRect.Bottom = Val(Mid$(R, j, i - j))
  499.         ' the point of the next line is to position the form off the screen until
  500.         ' after it is made visible by the ShowForm procedure
  501.         ' otherwise you get an instant of "garbage" when the form is
  502.         ' first made visible
  503.         Move Screen.Width, Screen.Height
  504.     Else
  505.         ' Arbitrary position defaults
  506.         i = 260 * Tpx
  507.         j = 80 * Tpy
  508.         Move Screen.Width - i, Screen.Height - j, i, j
  509.         GetWindowRect hWnd, MyRect
  510.     End If
  511.     If MyRect.Left > dtw Then
  512.         MyRect.Left = dtw \ 2 - 130
  513.         MyRect.Right = dtw \ 2 + 130
  514.     End If
  515.     If MyRect.Top > dth Then
  516.         MyRect.Top = dth \ 2 - 40
  517.         MyRect.Bottom = dth \ 2 + 40
  518.     End If
  519.     
  520.     Zoomed = (GetPrivateProfileInt(p, "State", 1, f) = SW_SHOWMAXIMIZED)
  521.  
  522.     If app.PrevInstance Then
  523.         ' you can have more then one instance, but randomize the placement
  524.         Zoomed = 0
  525.         Randomize
  526.         i = MyRect.Bottom - MyRect.Top
  527.         MyRect.Top = (dth - i) * Rnd
  528.         MyRect.Bottom = MyRect.Top + i
  529.         i = MyRect.Right - MyRect.Left
  530.         MyRect.Left = (dtw - i) * Rnd
  531.         MyRect.Right = MyRect.Left + i
  532.     End If
  533.     
  534.     TopMost = GetPrivateProfileInt(p, "TopMost", -2, f)
  535.     
  536.     Border = GetPrivateProfileInt(p, "Border", True, f)
  537.     If Border = False Then
  538.         MsgBlaster1.MsgPassage(2) = 0 'eat WM_NCLBUTTONDBLCLK
  539.     End If
  540.     OldBorder = Border
  541.     
  542.     Stuck = GetPrivateProfileInt(p, "Stuck", False, f)
  543.     
  544.     i = GetPrivateProfileString(p, "BackColor", "", R, 80, f)
  545.     If i >= 1 Then TimePan.BackColor = Val(R)
  546.     i = GetPrivateProfileString(p, "ForeColor", "", R, 80, f)
  547.     If i >= 1 Then TimePan.ForeColor = Val(R)
  548.     i = GetPrivateProfileString(p, "FontName", "", R, 80, f)
  549.     If i >= 1 Then TimePan.FontName = Left$(R, i)
  550.     i = GetPrivateProfileString(p, "FontOption", "", R, 80, f)
  551.     If i >= 1 Then
  552.         j = Val(R)
  553.         TimePan.FontBold = j And FO_BD
  554.         TimePan.FontItalic = j And FO_IT
  555.         TimePan.FontStrikethru = j And FO_ST
  556.         TimePan.FontUnderline = j And FO_UL
  557.         TimePan.Font3D = j And FO_3D
  558.     End If
  559.     i = GetPrivateProfileString(p, "FontFact", "", R, 80, f)
  560.     If i >= 1 Then FontFact = Val(R)
  561.     i = GetPrivateProfileString(p, "Font3DColor", "", R, 80, f)
  562.     If i >= 1 Then TimePan.Font3DColor = Val(R)
  563.     TimePan.Font3DSize = GetPrivateProfileInt(p, "Font3DSize", 0, f)
  564.     
  565.     TimePan.BevelInner = GetPrivateProfileInt(p, "BevelInner", 1, f)
  566.     TimePan.BevelOuter = GetPrivateProfileInt(p, "BevelOuter", 2, f)
  567.     TimePan.BevelInnerShading = GetPrivateProfileInt(p, "BevelInnerShading", 0, f)
  568.     TimePan.BevelOuterShading = GetPrivateProfileInt(p, "BevelOuterShading", 0, f)
  569.     TimePan.BevelInnerWidth = GetPrivateProfileInt(p, "BevelInnerWidth", 1, f)
  570.     TimePan.BevelOuterWidth = GetPrivateProfileInt(p, "BevelOuterWidth", 2, f)
  571.     TimePan.BorderInner = GetPrivateProfileInt(p, "BorderInner", 0, f)
  572.     TimePan.BorderOuter = GetPrivateProfileInt(p, "BorderOuter", 0, f)
  573.     TimePan.BorderInnerWidth = GetPrivateProfileInt(p, "BorderInnerWidth", 0, f)
  574.     TimePan.BorderOuterWidth = GetPrivateProfileInt(p, "BorderOuterWidth", 0, f)
  575.     i = GetPrivateProfileString(p, "BorderInnerColor", "", R, 80, f)
  576.     If i >= 1 Then TimePan.BorderInnerColor = Val(R)
  577.     i = GetPrivateProfileString(p, "BorderOuterColor", "", R, 80, f)
  578.     If i >= 1 Then TimePan.BorderOuterColor = Val(R)
  579.     
  580.     i = GetPrivateProfileString(p, "DateOption", "", R, 80, f)
  581.     If i >= 1 Then DateOption = Val(R)
  582.  
  583.     j = 0
  584.     i = GetPrivateProfileString(p, "BackMode", "", R, 80, f)
  585.     If i >= 1 Then
  586.         BackMode = Val(R)
  587.         If BackMode = BM_BITMAP Then BackBmp = Mid$(R, 3, i - 2)
  588.     End If
  589. End Sub
  590.  
  591. Sub MakeAboutMsg ()
  592. '*******************************************************
  593. '*                                                     *
  594. '*   Make a shameless self promotion for yourself.     *
  595. '*                                                     *
  596. '*******************************************************
  597.     
  598.     Dim s As String
  599.     
  600.     s = AppName & " " & Version & nl
  601.     s = s & "by " & Company
  602.     AboutFrm!AboutLab(0) = s
  603.     s = "P.O. Box 243" & nl
  604.     s = s & "Watertown, MA 02272" & nl
  605.     s = s & "CIS: 70402, 3651" & nl
  606.     s = s & "E-Mail: 70402.3651@compuserve.com" & nl
  607.     s = s & CopyRight
  608.     AboutFrm!AboutLab(1) = s
  609.     s = "   theTime is a free program written in "
  610.     s = s & "Visual Basic 3.0 - see technote.txt for the "
  611.     s = s & "techy details and see theTime.wri for "
  612.     s = s & "information about using it.... "
  613.     s = s & "Enjoy!   (Ben Jones)"
  614.     AboutFrm!AboutLab(2) = s
  615. End Sub
  616.  
  617. Sub MenuStuff (ByVal index As Integer, CheckIt As Integer)
  618. '*******************************************************
  619. '*                                                     *
  620. '*   Manage the checking and unchecking of menu items. *
  621. '*                                                     *
  622. '*******************************************************
  623.     
  624.     Dim hSubMenu As Integer, checked As Integer
  625.     
  626.     checked = MF_UNCHECKED
  627.     hSubMenu = GetSubMenu(hMyMenu, 5)
  628.     If CheckIt Then checked = MF_CHECKED
  629.     CheckMenuItem hSubMenu, index, MF_BYPOSITION Or checked
  630.     ' make the changes happen instantly
  631.     Timer1_Timer
  632. End Sub
  633.  
  634. Sub MsgBlaster1_Message (MsgVal As Integer, wparam As Integer, lParam As Long, ReturnVal As Long)
  635. '*******************************************************
  636. '*                                                     *
  637. '*   Event handler for the ModBlaster control which    *
  638. '*   is a slightly modified version of MsgBlaster that *
  639. '*   is found and documented on the MSDN CD.           *
  640. '*                                                     *
  641. '*******************************************************
  642.     
  643.     Dim hSubMenu As Integer
  644.     Dim checked As Integer
  645.     Dim lpoint As Long
  646.     Dim R As String * 80
  647.  
  648.     Select Case MsgVal
  649.  
  650.         Case WM_NCHITTEST
  651.             ' if there's no title/border and not maximized and not stuck then
  652.             ' and the click is in the client area then change it into a title
  653.             ' bar click so the window can be moved be clicking and dragging it
  654.             If ReturnVal = HTCLIENT And Not Border And IsZoomed(hWnd) = 0 And Not Stuck Then
  655.                 ReturnVal = HTCAPTION
  656.             End If
  657.         
  658.         Case WM_RBUTTONDOWN, WM_NCRBUTTONDOWN
  659.             ' pop up the menu on a right mouse click in the client area
  660.             ' which would be in the non client area (title bar) when
  661.             ' there is no title bar cause of what we did above
  662.             lpoint = lParam
  663.             If MsgVal = WM_RBUTTONDOWN Then
  664.                 ClientToScreenBylong hWnd, lpoint
  665.             ElseIf Border Then
  666.                 GoTo NoPopupMenu ' one goto per program I always say...
  667.             End If
  668.             checked = TrackPopupMenu(hMyMenu, 0, mbLoWord(lpoint), mbHiWord(lpoint), 0, hWnd, 0)
  669. NoPopupMenu:
  670.             ReturnVal = 0 ' this is required when if eat it
  671.         
  672.         Case WM_NCLBUTTONDBLCLK
  673.             ' switch to a title bar/border if there isn't one
  674.             If Not Border Then
  675.                 Border = True
  676.                 ShowTime
  677.                 CheckMenuItem hMyMenu, 1, MF_BYPOSITION Or MF_CHECKED
  678.                 MsgBlaster1.MsgPassage(2) = 1 'let windows post process WM_NCLBUTTONDBLCLK
  679.             End If
  680.             ReturnVal = 0 ' this is required if we eat it
  681.         
  682.         Case WM_LBUTTONDBLCLK
  683.             ' get rid of the title bar/border if there is one
  684.             Border = Not Border
  685.             ShowTime
  686.             CheckMenuItem hMyMenu, 1, MF_BYPOSITION Or MF_UNCHECKED
  687.             MsgBlaster1.MsgPassage(2) = 0 'eat WM_NCLBUTTONDBLCLK
  688.             ReturnVal = 0 ' this is required if we eat it
  689.         
  690.         Case WM_MOUSEACTIVATE
  691.             ' if stuck then avoid getting focus
  692.             If Stuck Then
  693.                 ReturnVal = MA_NOACTIVATE
  694.             Else
  695.                 ReturnVal = 0 ' this is required when if eat it
  696.             End If
  697.         
  698.         Case WM_MOVE
  699.             If ErasingBackgrnd = 0 Then EraseBackGrnd
  700.         
  701.         Case WM_ERASEBKGND
  702.             EraseBackGrnd
  703.             '  suppress normal erase backgound proccesing
  704.             ReturnVal = 1
  705.         
  706.         Case WM_DROPFILES
  707.             If DragQueryFile(wparam, 0, R, 80) Then
  708.                 'Debug.Print "dropfile, begin"
  709.                 Timer1.Enabled = False
  710.                 BackBmp = R
  711.                 BackMode = BM_BITMAP
  712.                 SetBackMode
  713.                 CheckBackItem
  714.                 Timer1.Enabled = True
  715.             End If
  716.             DragFinish wparam
  717.             Refresh
  718.             ReturnVal = 0
  719.             'Debug.Print "dropfile, end"
  720.         
  721.         Case WM_SYSCOMMAND, WM_COMMAND
  722.             ReturnVal = False ' this prevents post-processing by the modblaster control
  723.             checked = MF_CHECKED
  724.             ' cancel fetching the background
  725.             Select Case wparam
  726.                 Case 100 ' Top most
  727.                     If TopMost = HWND_NOTOPMOST Then
  728.                         TopMost = HWND_TOPMOST
  729.                     Else
  730.                         checked = MF_UNCHECKED
  731.                         TopMost = HWND_NOTOPMOST
  732.                     End If
  733.                     CheckMenuItem hMyMenu, 0, MF_BYPOSITION Or checked
  734.                     ShowTime
  735.                 Case 200 ' Title Bar
  736.                     Border = Not Border
  737.                     If Not Border Then
  738.                         checked = MF_UNCHECKED
  739.                         MsgBlaster1.MsgPassage(2) = 0 'eat WM_NCLBUTTONDBLCLK
  740.                     End If
  741.                     CheckMenuItem hMyMenu, 1, MF_BYPOSITION Or checked
  742.                     ShowTime
  743.                 Case 700 ' Stuck
  744.                     Stuck = Not Stuck
  745.                     If Not Stuck Then
  746.                         checked = MF_UNCHECKED
  747.                         SetFocus
  748.                     End If
  749.                     CheckMenuItem hMyMenu, 2, MF_BYPOSITION Or checked
  750.                 Case 310
  751.                     BackMode = BM_SOLID
  752.                     SetBackMode
  753.                     CheckBackItem
  754.                 Case 320
  755.                     LoadBitMap
  756.                     CheckBackItem
  757.                 Case 330
  758.                     BackMode = BM_TRANSPARENT
  759.                     SetBackMode
  760.                     CheckBackItem
  761.                 Case 340 ' Background Color
  762.                     CD.Flags = CC_RGBINIT
  763.                     CD.Color = TimePan.BackColor
  764.                     CD.Action = DLG_COLOR
  765.                     TimePan.BackColor = CD.Color
  766.                 Case 410 To 414 ' Font 3d Options
  767.                     hSubMenu = GetSubMenu(hMyMenu, 5)
  768.                     hSubMenu = GetSubMenu(hSubMenu, 0)
  769.                     CheckMenuItem hSubMenu, TimePan.Font3D, MF_BYPOSITION Or MF_UNCHECKED
  770.                     CheckMenuItem hSubMenu, wparam - 410, MF_BYPOSITION Or MF_CHECKED
  771.                     TimePan.Font3D = wparam - 410
  772.                 Case 415 To 419 ' Font 3d Size
  773.                     checked = TimePan.Font3DSize + wparam - 417
  774.                     If checked > 0 And checked <= 30 Then
  775.                         TimePan.Font3DSize = checked
  776.                     End If
  777.                 Case 420 ' thetime fonts
  778.                     CD.Color = TimePan.ForeColor
  779.                     CD.FontBold = TimePan.FontBold
  780.                     CD.FontItalic = TimePan.FontItalic
  781.                     CD.FontName = TimePan.FontName
  782.                     CD.FontSize = TimePan.FontSize
  783.                     CD.FontStrikeThru = TimePan.FontStrikethru
  784.                     CD.FontUnderLine = TimePan.FontUnderline
  785.                     CD.Flags = CF_BOTH Or CF_EFFECTS
  786.                     CD.Action = DLG_FONT
  787.                     TimePan.ForeColor = CD.Color
  788.                     TimePan.FontBold = CD.FontBold
  789.                     TimePan.FontItalic = CD.FontItalic
  790.                     TimePan.FontName = CD.FontName
  791.                     FontFact = FontFact * CD.FontSize / TimePan.FontSize
  792.                     TimePan.FontSize = CD.FontSize
  793.                     TimePan.FontStrikethru = CD.FontStrikeThru
  794.                     TimePan.FontUnderline = CD.FontUnderLine
  795.                 Case 425 ' Font 3D Color
  796.                     CD.Flags = CC_RGBINIT
  797.                     CD.Color = TimePan.Font3DColor
  798.                     CD.Action = DLG_COLOR
  799.                     TimePan.Font3DColor = CD.Color
  800.                 Case 430' Military Time
  801.                     DateOption = DateOption Xor DO_MT
  802.                     MenuStuff 3, DateOption And DO_MT
  803.                 Case 440' Full Day
  804.                     DateOption = DateOption Xor DO_DN
  805.                     MenuStuff 4, DateOption And DO_DN
  806.                 Case 450' Full Month
  807.                     DateOption = DateOption Xor DO_FM
  808.                     MenuStuff 5, DateOption And DO_FM
  809.                 Case 460' Full Year
  810.                     DateOption = DateOption Xor DO_FY
  811.                     MenuStuff 6, DateOption And DO_FY
  812.                 Case 465' Two Lines
  813.                     DateOption = DateOption Xor DO_1L
  814.                     MenuStuff 7, DateOption And DO_1L
  815.                 Case 470 To 474' Date Options
  816.                     hSubMenu = GetSubMenu(hMyMenu, 5)
  817.                     hSubMenu = GetSubMenu(hSubMenu, 9)
  818.                     CheckMenuItem hSubMenu, DateOption And DO_DF, MF_BYPOSITION Or MF_UNCHECKED
  819.                     CheckMenuItem hSubMenu, wparam - 470, MF_BYPOSITION Or MF_CHECKED
  820.                     DateOption = (DateOption And (Not DO_DF)) Or wparam - 470
  821.                     Timer1_Timer
  822.                 Case 500' Bevels
  823.                     ShowBevelOptFrm
  824.                 Case 600' About
  825.                     ShowAboutFrm
  826.                 Case 900' Exit - but don't end in the middle of this message
  827.                     SaveInitFile
  828.                     If (GetAsyncKeyState(VK_SHIFT) And &H8000) = 0 Then
  829.                         ' shift key not pressed, go ahead and exit
  830.                         ' first un-subclass everybody
  831.                         MsgBlaster1.hWndTarget = 0
  832.                         MsgBlaster1.hWndTarget = 0
  833.                         FreeLibrary (GetModuleHandle("modblast.vbx"))
  834.                         End
  835.                     End If
  836.                 Case SC_CLOSE ' handle this so we can un-subclass and free the library
  837.                     SaveInitFile
  838.                     ReturnVal = True ' enable post-processing
  839.                 Case Else
  840.                     ReturnVal = True ' enable post-processing
  841.             End Select
  842.     End Select
  843. End Sub
  844.  
  845. Sub ResizeFont ()
  846. '*******************************************************
  847. '*                                                     *
  848. '*   Attempt to resize the font proportionately to the *
  849. '*   size of theTime's panel.  FontFact keeps track of *
  850. '*   the size of the font relative to the form.  It's  *
  851. '*   a kludge but it seems to work.                    *
  852. '*                                                     *
  853. '*******************************************************
  854.     
  855.     Dim Fsw As Single, Fsh As Single
  856.     Dim lines As Single, x As Single
  857.     Dim aRect As RECT
  858.     Dim i As Integer, j As Integer
  859.     
  860.     If InStr(sDate, nl) Then
  861.         lines = 2.5
  862.         j = Len(sDate) - 1
  863.         If j < Len(sTime) Then
  864.             j = Len(sTime)
  865.         End If
  866.     Else
  867.         lines = 1.5
  868.         j = Len(sDate & sTime)
  869.         If j = 0 Then Exit Sub
  870.     End If
  871.     
  872.     If TimePan.BorderOuter Then i = i + TimePan.BorderOuterWidth
  873.     If TimePan.BevelOuter Then i = i + TimePan.BevelInnerWidth
  874.     If TimePan.BorderInner Then i = i + TimePan.BorderInnerWidth
  875.     If TimePan.BevelInner Then i = i + TimePan.BevelInnerWidth
  876.  
  877.     GetClientRect hWnd, aRect
  878.     InflateRect aRect, -i, -i
  879.  
  880.     Fsw = (aRect.Right - aRect.Left) * Tpx * FontFact / (10 * j) ' how big can the fonts be according to width
  881.     Fsh = (aRect.Bottom - aRect.Top) * Tpy * FontFact / (20 * lines)' ... according to height
  882.  
  883.     If Fsw < Fsh Then
  884.         x = Fsw
  885.     Else
  886.         x = Fsh
  887.     End If
  888.     If x < 8# Then x = 8#
  889.     TimePan.FontSize = x
  890. End Sub
  891.  
  892. Sub SaveInitFile ()
  893. '*******************************************************
  894. '*                                                     *
  895. '*   Write the ini file.                               *
  896. '*                                                     *
  897. '*******************************************************
  898.     
  899.     Dim i As Integer
  900.     Dim f As String, p As String, s As String
  901.     Dim MyPlace As WINDOWPLACEMENT
  902.     
  903.     If app.PrevInstance Then
  904.         Exit Sub
  905.     End If
  906.     Screen.MousePointer = 11
  907.     f = InitFile
  908.     p = "Preferences"
  909.     MyPlace.Length = 22
  910.  
  911.     GetWindowPlacement hWnd, MyPlace
  912.     CopyRect MyRect, MyPlace.rcNormalPosition
  913.     s = Str$(MyRect.Left) & Str$(MyRect.Right) & Str$(MyRect.Top) & Str$(MyRect.Bottom)
  914.     i = WritePrivateProfileString(p, "Position", s, f)
  915.     i = WritePrivateProfileString(p, "State", Str$(MyPlace.ShowCmd), f)
  916.     i = WritePrivateProfileString(p, "TopMost", Str$(TopMost), f)
  917.     i = WritePrivateProfileString(p, "Border", Str$(Border), f)
  918.     i = WritePrivateProfileString(p, "Stuck", Str$(Stuck), f)
  919.     i = WritePrivateProfileString(p, "BackColor", "&h" & Hex$(TimePan.BackColor) & "&", f)
  920.     i = WritePrivateProfileString(p, "ForeColor", "&h" & Hex$(TimePan.ForeColor) & "&", f)
  921.     i = WritePrivateProfileString(p, "FontName", TimePan.FontName, f)
  922.     i = TimePan.Font3D
  923.     If TimePan.FontBold Then i = i Or FO_BD
  924.     If TimePan.FontItalic Then i = i Or FO_IT
  925.     If TimePan.FontStrikethru Then i = i Or FO_ST
  926.     If TimePan.FontUnderline Then i = i Or FO_UL
  927.     i = WritePrivateProfileString(p, "FontOption", "&h" & Hex$(i), f)
  928.     i = WritePrivateProfileString(p, "FontFact", Str$(FontFact), f)
  929.     i = WritePrivateProfileString(p, "Font3DColor", "&h" & Hex$(TimePan.Font3DColor) & "&", f)
  930.     i = WritePrivateProfileString(p, "Font3DSize", Str$(TimePan.Font3DSize), f)
  931.  
  932.     i = WritePrivateProfileString(p, "BevelInner", Str$(TimePan.BevelInner), f)
  933.     i = WritePrivateProfileString(p, "BevelOuter", Str$(TimePan.BevelOuter), f)
  934.     i = WritePrivateProfileString(p, "BevelInnerShading", Str$(TimePan.BevelInnerShading), f)
  935.     i = WritePrivateProfileString(p, "BevelOuterShading", Str$(TimePan.BevelOuterShading), f)
  936.     i = WritePrivateProfileString(p, "BevelInnerWidth", Str$(TimePan.BevelInnerWidth), f)
  937.     i = WritePrivateProfileString(p, "BevelOuterWidth", Str$(TimePan.BevelOuterWidth), f)
  938.     
  939.     i = WritePrivateProfileString(p, "BorderInner", Str$(TimePan.BorderInner), f)
  940.     i = WritePrivateProfileString(p, "BorderOuter", Str$(TimePan.BorderOuter), f)
  941.     i = WritePrivateProfileString(p, "BorderInnerWidth", Str$(TimePan.BorderInnerWidth), f)
  942.     i = WritePrivateProfileString(p, "BorderOuterWidth", Str$(TimePan.BorderOuterWidth), f)
  943.     i = WritePrivateProfileString(p, "BorderInnerColor", "&h" & Hex$(TimePan.BorderInnerColor) & "&", f)
  944.     i = WritePrivateProfileString(p, "BorderOuterColor", "&h" & Hex$(TimePan.BorderOuterColor) & "&", f)
  945.     
  946.     i = WritePrivateProfileString(p, "DateOption", "&h" & Hex$(DateOption), f)
  947.     s = Str$(BackMode) & " " & BackBmp
  948.     i = WritePrivateProfileString(p, "Backmode", s, f)
  949.     Screen.MousePointer = 0
  950. End Sub
  951.  
  952. Sub SetBackMode ()
  953. '*******************************************************
  954. '*                                                     *
  955. '*   Set the background modeont proportionately to the *
  956. '*   size of theTime's panel.  FontFact keeps track of *
  957. '*   the size of the font relative to the form.  It's  *
  958. '*   a kludge but it seems to work.                    *
  959. '*                                                     *
  960. '*******************************************************
  961.     
  962.     On Error Resume Next
  963.     TimePan.BackStyle = 1
  964.     If BackMode = BM_SOLID Then
  965.         TimePan.Picture = LoadPicture("")
  966.         BackBmp = ""
  967.     ElseIf BackMode = BM_BITMAP Then ' loading a bitmap
  968.         TimePan.Picture = LoadPicture(BackBmp)
  969.         If Err <> 0 Then
  970.             MsgBox "Error loading " & BackBmp & nl & "Invalid bitmap file format!", 48
  971.             ' no bitmap loaded
  972.             BackMode = BM_SOLID
  973.             BackBmp = ""
  974.         End If
  975.     Else
  976.         TimePan.BackStyle = 0
  977.         ' the next two lines do about the same thing. One advantage to using
  978.         ' InvalidateRectbynum is that erasing the background can be turned off
  979.         'InvalidateRectbynum hwnd, 0, True
  980.         Refresh
  981.     End If
  982. End Sub
  983.  
  984. Sub ShowAboutFrm ()
  985. '*******************************************************
  986. '*                                                     *
  987. '*   Show a shameless self promotion.                  *
  988. '*                                                     *
  989. '*******************************************************
  990.     
  991.     Dim i As Integer
  992.     
  993.     MakeAboutMsg
  994.     AdjustForm AboutFrm
  995.     AboutFrm.Caption = "About " & AppName
  996.     AboutFrm!AboutPan.Icon = Icon
  997.     ' this form might need to be set topmost
  998.     SetWindowPos AboutFrm.hWnd, TopMost, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE
  999.     AboutFrm.Show 1
  1000.     Unload AboutFrm
  1001. End Sub
  1002.  
  1003. Sub ShowBevelOptFrm ()
  1004. '*******************************************************
  1005. '*                                                     *
  1006. '*   Now for the really interesting stuff.  Show a     *
  1007. '*   dialog box that is almost entirely created out of *
  1008. '*   PZLabels.  PZLabels are part of Pizazz.vbx, an    *
  1009. '*   inexpensize VBX that can be purchased through     *
  1010. '*   Compuserve (#6551).   Remarkably enough, it is    *
  1011. '*   possible to make tabs, 3D options, and 3D spin    *
  1012. '*   buttons with a little code and Pizazz!.           *
  1013. '*                                                     *
  1014. '*******************************************************
  1015.     
  1016.     Dim f As Form, T As PZLabel
  1017.     ReDim opt(1) As Integer
  1018.     Dim i As Integer
  1019.     
  1020.     ' use object variables to make my typing easier!
  1021.     Set f = BevelOptFrm
  1022.     Set T = TimePan
  1023.     
  1024.     AdjustForm f
  1025.     
  1026.     ' pass properties using tags
  1027.     f!TabPan.Tag = "0" ' set the "up" tab
  1028.     f!Tabs(0).Tag = Str$(T.BevelOuter)
  1029.     f!Tabs(1).Tag = Str$(T.BevelInner)
  1030.     f!Tabs(2).Tag = Str$(T.BorderOuter)
  1031.     f!Tabs(3).Tag = Str$(T.BorderInner)
  1032.     f!WidthLab(0) = Str$(T.BevelOuterWidth)
  1033.     f!WidthLab(1) = Str$(T.BevelInnerWidth)
  1034.     f!WidthLab(2) = Str$(T.BorderOuterWidth)
  1035.     f!WidthLab(3) = Str$(T.BorderInnerWidth)
  1036.  
  1037.     ' setting the bevel shade options is confusing because
  1038.     ' the "white light" option reverses its value depending
  1039.     ' on the "black shade" option
  1040.     opt(0) = T.BevelOuterShading
  1041.     opt(1) = T.BevelInnerShading
  1042.     For i = 0 To 1
  1043.         ' there are four color option buttons, two for each property
  1044.         f!ColorOpt(i * 2).Tag = Str$((opt(i) < 2 Xor opt(i)) And 1)
  1045.         f!ColorOpt(i * 2 + 1).Tag = Str$(opt(i) And 2)
  1046.     Next
  1047.  
  1048.     f!ColorOpt(4).Tag = Str$(T.BorderOuterColor)
  1049.     f!ColorOpt(6).Tag = Str$(T.BorderInnerColor)
  1050.  
  1051.     ' might need to be set topmost
  1052.     SetWindowPos BevelOptFrm.hWnd, TopMost, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE
  1053.     f.Show 1
  1054.     If Trim$(f.Tag) = "1" Then
  1055.         ' OK was pressed
  1056.         T.BevelOuter = Val(f!Tabs(0).Tag)
  1057.         T.BevelInner = Val(f!Tabs(1).Tag)
  1058.         T.BorderOuter = Val(f!Tabs(2).Tag)
  1059.         T.BorderInner = Val(f!Tabs(3).Tag)
  1060.         T.BevelOuterWidth = Val(f!WidthLab(0))
  1061.         T.BevelInnerWidth = Val(f!WidthLab(1))
  1062.         T.BorderOuterWidth = Val(f!WidthLab(2))
  1063.         T.BorderInnerWidth = Val(f!WidthLab(3))
  1064.         For i = 0 To 1
  1065.             opt(i) = Val(f!ColorOpt(i * 2 + 1).Tag)
  1066.             opt(i) = opt(i) + Val(f!ColorOpt(i * 2).Tag) Xor (opt(i) < 2) And 1
  1067.         Next
  1068.         T.BevelOuterShading = opt(0)
  1069.         T.BevelInnerShading = opt(1)
  1070.  
  1071.         T.BorderOuterColor = Val(f!ColorOpt(4).Tag)
  1072.         T.BorderInnerColor = Val(f!ColorOpt(6).Tag)
  1073.  
  1074.         ResizeFont
  1075.     End If
  1076.     Unload BevelOptFrm
  1077. End Sub
  1078.  
  1079. Sub ShowForm ()
  1080. '*******************************************************
  1081. '*                                                     *
  1082. '*   Show theTime's form.  Can't just do a show method *
  1083. '*   because the form's title and borders may or may   *
  1084. '*   not be present and the form may have the TopMost  *
  1085. '*   position and good old VB doesn't support setting  *
  1086. '*   these things at run time.                         *
  1087. '*                                                     *
  1088. '*******************************************************
  1089.     
  1090.     Dim x As Integer, y As Integer
  1091.     Dim w As Integer, h As Integer
  1092.     Dim i As Integer
  1093.     Dim Clrect As RECT
  1094.     Dim MyPlace As WINDOWPLACEMENT
  1095.     Dim l As Long
  1096.     
  1097.     If Border Then
  1098.         l = WS_OVERLAPPEDWINDOW Or WS_VISIBLE
  1099.     Else
  1100.         l = WS_VISIBLE
  1101.     End If
  1102.     If Zoomed Then
  1103.         l = l Or WS_MAXIMIZE
  1104.     End If
  1105.     l = SetWindowLong(hWnd, GWL_STYLE, l)
  1106.     If Zoomed = 0 Then
  1107.         x = MyRect.Left
  1108.         y = MyRect.Top
  1109.         w = MyRect.Right - x
  1110.         h = MyRect.Bottom - y
  1111.         If x > dtw - BorderSize Then
  1112.             x = dtw - w
  1113.         End If
  1114.         If y > dth - BorderSize Then
  1115.             y = dth - h
  1116.         End If
  1117.     Else
  1118.         If Border Then i = BorderSize
  1119.         x = -i
  1120.         y = -i
  1121.         w = dtw + 2 * i
  1122.         h = dth + 2 * i
  1123.     End If
  1124.     
  1125.     ' the next line fires the move and form resize event and makes
  1126.     ' the form visible
  1127.     ' (note this is only way to set topmost)
  1128.     SetWindowPos hWnd, TopMost, x, y, w, h, SWP_NOACTIVATE
  1129.     If Not Stuck Then SetFocus
  1130.     If Zoomed Then
  1131.         MyPlace.Length = 22
  1132.         GetWindowPlacement hWnd, MyPlace
  1133.         CopyRect MyPlace.rcNormalPosition, MyRect
  1134.         SetWindowPlacement hWnd, MyPlace
  1135.     End If
  1136.     TimePan.Visible = True
  1137. End Sub
  1138.  
  1139. Sub ShowTime ()
  1140. '*******************************************************
  1141. '*                                                     *
  1142. '*   Set the border and title or lack thereof window   *
  1143. '*   style and the topmost position while you're at    *
  1144. '*   it.                                               *
  1145. '*                                                     *
  1146. '*******************************************************
  1147.     
  1148.     Dim l As Long
  1149.     Dim x As Integer, y As Integer
  1150.     Dim w As Integer, h As Integer
  1151.     Dim i As Integer
  1152.     Dim flag As Long
  1153.     Dim Clrect As RECT
  1154.     
  1155.     If Border <> OldBorder Then
  1156.         GetWindowRect hWnd, MyRect
  1157.         GetClientRect hWnd, Clrect
  1158.         Zoomed = IsZoomed(hWnd)
  1159.         flag = WS_VISIBLE ' no border, no caption, no nothin
  1160.         If Zoomed = 0 Then
  1161.             If Border Then
  1162.                 x = MyRect.Left - BorderSize
  1163.                 y = MyRect.Top - TitleSize - BorderSize
  1164.                 w = MyRect.Right - MyRect.Left + 2 * BorderSize
  1165.                 h = MyRect.Bottom - MyRect.Top + TitleSize + 2 * BorderSize
  1166.             Else
  1167.                 x = MyRect.Left + BorderSize
  1168.                 y = MyRect.Top + TitleSize + BorderSize
  1169.                 w = Clrect.Right - Clrect.Left
  1170.                 h = Clrect.Bottom - Clrect.Top
  1171.             End If
  1172.         Else
  1173.             If Border Then i = BorderSize
  1174.             x = -i
  1175.             y = -i
  1176.             w = dtw + 2 * i
  1177.             h = dth + 2 * i
  1178.         End If
  1179.         If Border Then
  1180.             flag = flag Or WS_OVERLAPPEDWINDOW Or WS_VISIBLE ' back to normal
  1181.         End If
  1182.         If Zoomed Then
  1183.             flag = flag Or WS_MAXIMIZE
  1184.         End If
  1185.         l = SetWindowLong(hWnd, GWL_STYLE, flag)
  1186.         SetWindowPos hWnd, TopMost, x, y, w, h, SWP_NOACTIVATE
  1187.         OldBorder = Border
  1188.     Else
  1189.         SetWindowPos hWnd, TopMost, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE
  1190.     End If
  1191. End Sub
  1192.  
  1193. Sub Timer1_Timer ()
  1194. '*******************************************************
  1195. '*                                                     *
  1196. '*   Event handler for the timer.  Update the time.    *
  1197. '*                                                     *
  1198. '*******************************************************
  1199.     
  1200.     Dim mm As String, yy As String
  1201.     
  1202.     sTime = "h:mm"
  1203.     If (DateOption And DO_MT) = 0 Then sTime = sTime & " A/P"
  1204.     sDate = ""
  1205.     If DateOption And DO_DN Then sDate = "dddd "
  1206.     mm = "mmm"
  1207.     If DateOption And DO_FM Then mm = "mmmm"
  1208.     yy = "yy  "
  1209.     If DateOption And DO_FY Then yy = "yyyy  "
  1210.     Select Case DateOption And DO_DF
  1211.         Case 0 'no date
  1212.         Case 1 'd/m/y
  1213.             sDate = sDate & "m/d/" & yy
  1214.         Case 2 'm-d-y
  1215.             sDate = sDate & "dd-" & mm & "-" & yy
  1216.         Case 3 'm d, y
  1217.             sDate = sDate & mm & " d, " & yy
  1218.         Case 4 'm d
  1219.             sDate = sDate & mm & " d  "
  1220.     End Select
  1221.     If sDate <> "" Then
  1222.         sDate = Format$(Now, sDate)
  1223.     End If
  1224.     If Command$ <> "" Then
  1225.         sDate = Command$ & " " & sDate
  1226.     End If
  1227.     If sDate <> "" And ((DateOption And DO_1L) = 0) Then
  1228.         sDate = RTrim$(sDate) & nl ' two lines
  1229.     End If
  1230.     sTime = Format$(Now, sTime)
  1231.     If IsIconic(hWnd) Then
  1232.         If sTime <> Caption Then Caption = sTime
  1233.     ElseIf sDate & sTime <> TimePan.Caption Then
  1234.         ResizeFont
  1235.         TimePan.Caption = sDate & sTime
  1236.         EraseBackGrnd
  1237.     End If
  1238.     If ErasingBackgrnd = 1 Then EraseBackGrnd
  1239. End Sub
  1240.  
  1241.